home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / news / nntp / nntp.1.5.11 / server / ahbs.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-12-11  |  2.7 KB  |  129 lines

  1. #ifndef lint
  2. static char    *sccsid = "@(#)ahbs.c    1.8    (Berkeley) 1/11/88";
  3. #endif
  4.  
  5. #include "common.h"
  6.  
  7. static char    *verbiage[] = {
  8.     "head and body follow",
  9.     "head follows",
  10.     "body follows",
  11.     "request text separately"
  12. };
  13.  
  14. /*
  15.  * {ARTICLE,HEAD,BODY,STAT} <messageid>|articlenum
  16.  *
  17.  * Retrieve article, head, body, or stat, depending on the
  18.  * command we were invoked with.
  19.  */
  20.  
  21. ahbs(argc, argv)
  22.     int        argc;
  23.     char        *argv[];
  24. {
  25.     char        artbuf[MAXPATHLEN], art_id[MAXBUFLEN];
  26.     register char    c;
  27.     int        method;
  28.     register FILE    *fp;        /* For Message-ID retrieval only */
  29.  
  30.     if (argc > 2) {
  31.         printf("%d Usage: %s <message-id>|article_number.\r\n",
  32.             ERR_CMDSYN,argv[0]);
  33.         (void) fflush(stdout);
  34.         return;
  35.     }
  36.  
  37.     if ((c = *argv[0]) == 'a' || c == 'A')
  38.         method = ARTICLE;
  39.     else if ((c == 's' || c == 'S'))
  40.         method = STAT;
  41.     else
  42.         method = ((c == 'h' || c == 'H') ? HEAD : BODY);
  43.  
  44.     if (argc == 2 && *argv[1] == '<') {    /* Message ID */
  45.         fp = openartbyid(argv[1]);
  46.         if (fp == NULL) {
  47.             printf("%d No article by message-id %s, sorry.\r\n",
  48.                 ERR_NOART, argv[1]);
  49.             (void) fflush(stdout);
  50.             return;
  51.         }
  52.         if (check_ngperm(fp) == 0) {
  53.             printf("%d Can't give that to you, sorry.\r\n",
  54.                 ERR_ACCESS);
  55.             (void) fflush(stdout);
  56.             (void) fclose(fp);
  57.             return;
  58.         }
  59.         printf("%d 0 %s Article retrieved, %s.\r\n",
  60.             OK_ARTICLE + method, argv[1], verbiage[method]);
  61.         spew(fp, method);
  62.         (void) fclose(fp);
  63. #ifdef LOG
  64.         if (nn_told)
  65.             nn_took++;
  66. #endif
  67.         return;
  68.     }
  69.  
  70.     /* Else we're trying to read */
  71.  
  72.     if (!canread) {
  73.         printf("%d You only have permission to transfer, sorry.\r\n",
  74.             ERR_ACCESS);
  75.         (void) fflush(stdout);
  76.         return;
  77.     }
  78.  
  79.     if (!ingroup) {
  80.         printf("%d You are not currently in a newsgroup.\r\n",
  81.             ERR_NCING);
  82.         (void) fflush(stdout);
  83.         return;
  84.     }
  85.  
  86.     if (argc == 1) {
  87.         if (art_ptr < 0 || art_ptr >= num_arts) {
  88.             printf("%d No article is currently selected.\r\n",
  89.                 ERR_NOCRNT);
  90.             (void) fflush(stdout);
  91.             return;
  92.         }
  93.         (void) sprintf(artbuf, "%d", art_array[art_ptr]);
  94.     } else
  95.         (void) strcpy(artbuf, argv[1]);
  96.  
  97.     if (!valid_art(artbuf)) {
  98.         printf("%d Invalid article number: %s.\r\n",
  99.             ERR_NOARTIG, artbuf);
  100.         (void) fflush(stdout);
  101.         return;
  102.     }
  103.  
  104.     while (open_valid_art(artbuf, art_id) == NULL) {
  105.         if (argc > 1) {
  106.             printf("%d Invalid article number: %s.\r\n",
  107.                 ERR_NOARTIG, artbuf);
  108.             (void) fflush(stdout);
  109.             return;
  110.         } else {
  111.             if (++art_ptr >= num_arts) {
  112.                 printf("%d Invalid article number.\r\n",
  113.                     ERR_NOARTIG);
  114.                 (void) fflush(stdout);
  115.                 return;
  116.             }
  117.             (void) sprintf(artbuf, "%d", art_array[art_ptr]);
  118.         }
  119.     }
  120.  
  121.     printf("%d %s %s Article retrieved; %s.\r\n",
  122.         OK_ARTICLE + method, artbuf, art_id, verbiage[method]);
  123.  
  124.     spew(art_fp, method);
  125.  
  126.     if (argc > 1)
  127.         art_ptr = findart(artbuf);
  128. }
  129.